package com.atguigu.lease.web.admin.schedule;

import com.atguigu.lease.model.entity.LeaseAgreement;
import com.atguigu.lease.model.enums.LeaseStatus;
import com.atguigu.lease.web.admin.service.LeaseAgreementService;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * SpringBoot定时任务定时逻辑
 *
 * @author Taeyang
 * @date 2025/3/20
 */
@Component
public class ScheduledTasks {
    @Autowired
    private LeaseAgreementService leaseAgreementService;

    /**
     * 使用@Scheduled注解标记此方法为定时任务，每天午夜（00:00）执行一次
     */
    @Scheduled(cron = "0 0 0 * * *")
    public void checkLeaseStatus() {
        // 创建一个LambdaUpdateWrapper对象，用于构建更新条件
        LambdaUpdateWrapper<LeaseAgreement> updateWrapper = new LambdaUpdateWrapper<>();

        // 获取当前日期和时间
        Date now = new Date();

        // 添加一个条件，指定leaseEndDate字段的值必须小于或等于当前日期和时间
        // 这意味着我们要查找所有在当前时间之前到期的租赁协议
        // 注意：由于时间戳的精确匹配在实际操作中可能很难实现，因此“等于当前时间”的情况通常不会被考虑
        updateWrapper.le(LeaseAgreement::getLeaseEndDate, now);

        // 添加另一个条件，指定status字段的值必须是SIGNED（已签署）或WITHDRAWING（正在撤回）之一
        // 这意味着我们只关心那些处于这两种状态的租赁协议
        updateWrapper.in(LeaseAgreement::getStatus, LeaseStatus.SIGNED, LeaseStatus.WITHDRAWING);

        // 设置更新操作，将满足上述条件的租赁协议的状态更新为EXPIRED（已过期）
        updateWrapper.set(LeaseAgreement::getStatus, LeaseStatus.EXPIRED);

        // 调用leaseAgreementService的update方法，传入构建好的updateWrapper对象
        // 这将执行更新操作，更新数据库中满足条件的租赁协议的状态
        leaseAgreementService.update(updateWrapper);
    }
}
